home *** CD-ROM | disk | FTP | other *** search
/ Mission 3 / Mission 3.zip / Mission 3.iso / texte / qed / src / prn_cfg.c < prev    next >
C/C++ Source or Header  |  1998-11-09  |  17KB  |  742 lines

  1. #include <gemx.h>
  2.  
  3. #include "global.h"
  4. #include "file.h"
  5. #include "options.h"
  6. #include "printer.h"
  7. #include "rsc.h"
  8. #include "wp-print.h"
  9.  
  10. /*
  11.  * aus cflib
  12. */
  13. extern void handle_mdial_msg(int *msg);
  14.  
  15. /*
  16.  * globale Variablen
  17. */
  18. PRN_CFG    *prn;
  19.  
  20. /*
  21.  * lokales
  22. */
  23. static int    gdos_device = 21;            /* Dev-Nummer 21 .. 30 */
  24. static char    gdos_name[80] = "";        /* Dev-Name */
  25. static int    fnt_anz;
  26. static bool    wp_config_read = FALSE;
  27.  
  28. #define CFGNAME    "pdlg.qed"            /* Name der Settings-Datei */
  29.  
  30. /* --------------------------------------------------------------------------- */
  31. bool open_printer(void)
  32. {
  33.     int    work_out[57];
  34.     int    i, p_xy[4];
  35.     bool    ret = FALSE;
  36.     
  37.     if (prn->use_pdlg)
  38.         prn->handle = v_opnprn(gl_phys_handle, prn->pdlg, work_out);
  39.     else
  40.     {
  41.         int    work_in[16];
  42.  
  43.         work_in[0] = gdos_device;
  44.         for (i=1; i < 10; i++)
  45.             work_in[i] = 1;
  46.         work_in[10] = 2;
  47.         for (i=11; i < 16; i++)
  48.             work_in[i] = 0;
  49.         v_opnwk(work_in, &prn->handle, work_out);
  50.     }
  51.     if (prn->handle)
  52.     {
  53.         fnt_anz = work_out[10] + vst_load_fonts(prn->handle, 0);
  54.     
  55.         prn->height = work_out[1];
  56.         p_xy[0] = 0;
  57.         p_xy[1] = 0;
  58.         p_xy[2] = work_out[0] - 1;
  59.         p_xy[3] = work_out[1] + 1;
  60.         vs_clip(prn->handle, TRUE, p_xy);
  61.         vswr_mode(prn->handle, MD_TRANS);
  62.         ret = TRUE;
  63.     }
  64.     return ret;
  65. }
  66.  
  67.  
  68. void close_printer(void)
  69. {
  70.     vst_unload_fonts(prn->handle, 0);
  71.     v_clswk(prn->handle);
  72. }
  73.  
  74.  
  75. static void get_fontname(int id, char *name)
  76. {
  77.     int    d;
  78.     
  79.     if (open_printer())
  80.     {
  81.         for (d = 1; d <= fnt_anz; d++)
  82.             if (vqt_name(prn->handle, d, name) == id)
  83.                 break;
  84.         close_printer();
  85.     }
  86.     else
  87.         strcpy(name, "???");
  88. }
  89.  
  90.  
  91. static bool sel_font(PRN_CFG *cfg)
  92. {
  93.     bool    ok = FALSE;
  94.     int    n_id, n_pts;
  95.     
  96.     n_id = cfg->font_id;
  97.     n_pts = cfg->font_pts;
  98.     
  99.     ok = do_fontsel((FS_M_XFSL|FS_M_MAGX), rsc_string(SELPFONTSTR), &n_id, &n_pts);
  100.     if (ok)
  101.     {
  102.         cfg->font_id = n_id;
  103.         cfg->font_pts = n_pts;
  104.         ok = TRUE;
  105.     }
  106.     else if (n_id == -1 && n_pts == -1)
  107.         note(1, 0, NOFSL);
  108.  
  109.     return ok;
  110. }
  111.  
  112. /* --------------------------------------------------------------------------- */
  113. /*
  114.  * WDIALOG
  115. */
  116.  
  117. /*
  118.  * Callbacks für Sub-Dialog
  119. */
  120. long cdecl init_qed_sub(PRN_SETTINGS *settings, PDLG_SUB *sub_dialog)
  121. {
  122.     OBJECT    *tree;
  123.     int        offset;
  124.     PRN_CFG    *cfg;
  125.     char        tmp[40];
  126.     
  127.     cfg = (PRN_CFG *)sub_dialog->private1;
  128.     tree = sub_dialog->tree;
  129.     offset = sub_dialog->index_offset;
  130.  
  131.     set_int(tree, PS_GFPTS + offset, cfg->font_pts);
  132.     get_fontname(cfg->font_id, tmp);
  133.     set_string(tree, PS_GFNAME + offset, tmp);
  134.  
  135.     set_state(tree, PS_ALL + offset, DISABLED, !cfg->ausdruck);
  136.     set_state(tree, PS_BLOCK + offset, DISABLED, (!cfg->ausdruck || !cfg->block));
  137.  
  138.     set_state(tree, PS_ALL + offset, SELECTED, !cfg->block);
  139.     set_state(tree, PS_BLOCK + offset, SELECTED, cfg->block);
  140.     
  141.     set_state(tree, PS_ZNUM + offset, SELECTED, cfg->num_zeilen);
  142.     set_state(tree, PS_SNUM + offset, SELECTED, cfg->num_seiten);
  143.     
  144.     set_int(tree, PS_RANDLEN + offset, cfg->rand_len);
  145.  
  146.     return 1;
  147. }
  148.  
  149. long cdecl do_qed_sub(PRN_SETTINGS *settings, PDLG_SUB *sub_dialog, short exit_obj)
  150. {
  151.     OBJECT    *tree;
  152.     int        offset;
  153.     PRN_CFG    *cfg;
  154.     
  155.     cfg = (PRN_CFG *)sub_dialog->private1;
  156.     tree = sub_dialog->tree;
  157.     offset = sub_dialog->index_offset;
  158.     switch (exit_obj - offset)
  159.     {
  160.         case PS_GFSEL :
  161.             if (sel_font(cfg))
  162.             {
  163.                 char    tmp[40];
  164.                 
  165.                 set_int(tree, PS_GFPTS + offset, cfg->font_pts);
  166.                 get_fontname(cfg->font_id, tmp);
  167.                 set_string(tree, PS_GFNAME + offset, tmp);
  168.                 redraw_obj(tree, PS_GFPTS + offset);
  169.                 redraw_obj(tree, PS_GFNAME + offset);
  170.             }
  171.             set_state(tree, exit_obj, SELECTED, FALSE);
  172.             redraw_obj(tree, exit_obj);
  173.             break;
  174.  
  175.         default:
  176.             break;
  177.     }
  178.     return 1;
  179. }
  180.  
  181. long cdecl reset_qed_sub(PRN_SETTINGS *settings, PDLG_SUB *sub_dialog)
  182. {
  183.     OBJECT    *tree;
  184.     int        offset;
  185.     PRN_CFG    *cfg;
  186.     
  187.     cfg = (PRN_CFG *)sub_dialog->private1;
  188.     tree = sub_dialog->tree;
  189.     offset = sub_dialog->index_offset;
  190.     
  191.     if (cfg->ausdruck)
  192.         cfg->block = get_state(tree, PS_BLOCK + offset, SELECTED);
  193.  
  194.     cfg->num_zeilen = get_state(tree, PS_ZNUM + offset, SELECTED);
  195.     cfg->num_seiten = get_state(tree, PS_SNUM + offset, SELECTED);
  196.     cfg->rand_len = get_int(tree, PS_RANDLEN + offset);
  197.  
  198.     return 1;
  199. }
  200.  
  201.  
  202. static bool pdlg_dial(PRN_CFG *cfg)
  203. {
  204.     PRN_DIALOG        *prn_dialog;
  205.     PRN_SETTINGS    *new;
  206.     int                d, button, ret, handle;
  207.     EVNT                ev;
  208.     OBJECT            *tree;
  209.     
  210.     new = malloc(sizeof(PRN_SETTINGS));
  211.     memcpy(new, cfg->pdlg, sizeof(PRN_SETTINGS));
  212.  
  213.     prn_dialog = pdlg_create(PDLG_3D);
  214.     if (prn_dialog)
  215.     {
  216.         PDLG_SUB    *sub = NULL;
  217.  
  218.         disable_menu();
  219.  
  220.         /* Unterdialog einhängen */
  221.         sub = malloc(sizeof(PDLG_SUB));
  222.         if (sub)
  223.         {
  224.             memset(sub, 0, sizeof(PDLG_SUB));
  225.             sub->sub_id = -1;
  226.             rsrc_gaddr(R_TREE, PRN_ICON, &tree);
  227.             sub->sub_icon = tree + 1;                /* Zeiger auf das Icon */
  228.             sub->sub_tree = printer_sub;            /* Zeiger auf den Unterdialog */
  229.             sub->init_dlg = init_qed_sub;            /* Initialisierungsfunktion */
  230.             sub->do_dlg = do_qed_sub;                /* Behandlungsfunktion */
  231.             sub->reset_dlg = reset_qed_sub;        /* Zurücksetzfunktion */
  232.  
  233.             sub->private1 = (long)cfg;
  234.  
  235.             pdlg_add_sub_dialogs(prn_dialog, sub);
  236.         }
  237.  
  238.         if (cfg->ausdruck)
  239.             handle = pdlg_open(prn_dialog, new, "qed", 0x0001, -1, -1);
  240.         else
  241.             handle = pdlg_open(prn_dialog, new, "qed", 0x0000, -1, -1);
  242.         do
  243.         {
  244.             ev.mwhich = (short)evnt_multi(MU_KEYBD|MU_MESAG|MU_BUTTON, 2, 1, 1, 
  245.                                                 0, 0, 0, 0, 0,    0, 0, 0, 0, 0,
  246.                                                 (int*)ev.msg, 0, 
  247.                                                 (int*)&ev.mx, (int*)&ev.my, 
  248.                                                 (int*)&ev.mbutton, 
  249.                                                 (int*)&ev.kstate,    (int*)&ev.key, 
  250.                                                 (int*)&ev.mclicks);
  251.             if (ev.mwhich & MU_MESAG)
  252.             {
  253.                 switch (ev.msg[0])
  254.                 {
  255.                     case WM_REDRAW :
  256.                     case WM_MOVED :
  257.                     case WM_SIZED:
  258.                         if (ev.msg[3] != handle)    /* für fremdes Fenster */
  259.                         {
  260.                             handle_mdial_msg((int *)ev.msg);
  261.                         }
  262.                         break;
  263.     
  264.                     case WM_BOTTOMED:                    /* nicht erlaubt! */
  265.                         break;
  266.                     
  267.                     case WM_TOPPED :
  268.                     case WM_NEWTOP :
  269.                     case WM_ONTOP :        
  270.                         ev.msg[0] = WM_TOPPED;        /* immer Druckerbox toppen! */
  271.                         ev.msg[3] = handle;
  272.                         break;
  273.                 }
  274.     
  275.             }
  276.             ret = pdlg_evnt(prn_dialog, new, &ev, &button);
  277.         } 
  278.         while (ret == 1);
  279.         
  280.         if (button == PDLG_OK)
  281.         {
  282.             memcpy(cfg->pdlg, new, sizeof(PRN_SETTINGS));
  283.             pdlg_use_settings(prn_dialog, new);
  284.         }
  285.  
  286.         pdlg_close(prn_dialog, &d, &d);
  287.  
  288.         if (sub)
  289.         {
  290.             pdlg_remove_sub_dialogs(prn_dialog);
  291.             free(sub);
  292.         }
  293.  
  294.         pdlg_delete(prn_dialog);
  295.         free(new);
  296.  
  297.         enable_menu();
  298.  
  299.         return (button == PDLG_OK);
  300.     }
  301.     return FALSE;
  302. }
  303.  
  304.  
  305. /* --------------------------------------------------------------------------- */
  306. /*
  307.  * qed-Dialog
  308. */
  309.  
  310. static void get_devinfo(int handle, int device, char *devname)
  311. {
  312.     if (gl_nvdi >= 0x300)
  313.     {
  314.         int    d;
  315.         char    s[80];
  316.  
  317.         vq_devinfo(handle, device, &d, s, devname);
  318.     }
  319.     else
  320.         sprintf(devname, "GDOS Printer %d", device);
  321. }
  322.  
  323. static bool get_gdos_device(void)
  324. {
  325.     if (gdos_device == 0 || gdos_name[0] == EOS)
  326.     {
  327.         int    work_in[16];
  328.         int    work_out[57];
  329.         int    i, handle;
  330.         
  331.         for (i=1; i < 10; i++)
  332.             work_in[i] = 1;
  333.         work_in[10] = 2;
  334.         for (i=11; i < 16; i++)
  335.             work_in[i] = 0;
  336.         for (i = 21; i < 31; i++)
  337.         {
  338.             work_in[0] = i;
  339.             v_opnwk(work_in, &handle, work_out);
  340.             if (handle > 0)
  341.             {
  342.                 gdos_device = i;
  343.                 get_devinfo(handle, i, gdos_name);
  344.                 v_clswk(handle);
  345.                 break;
  346.             }
  347.         }
  348.         gdos_name[32] = EOS;                /* mehr passt nicht in den G_STRING! */
  349.     }
  350.     return (gdos_device > 0);
  351. }
  352.  
  353.  
  354. static bool qed_cfg_dial(PRN_CFG *cfg)
  355. {
  356.     char        tmp[33];
  357.     int        antw, i;
  358.     bool        close = FALSE;
  359.     PATH        str = "";
  360.     MDIAL        *dial;
  361.     
  362.     /* GEMDOS */
  363.     switch (cfg->wp_mode)
  364.     {
  365.         case ELITE:
  366.             i = DICHTEELITE;
  367.             break;
  368.         case CONDENSED:
  369.             i = DICHTECOND;
  370.             break;
  371.         default:
  372.             i = DICHTEPICA;
  373.             break;
  374.     }
  375.     set_string(printer, DDICHTE, (char *)get_obspec(popups, i));
  376.     if (!wp_config_read && cfg->wp_treiber[0] != EOS)
  377.         wp_config_read = wp_load_cfgfile(cfg->wp_treiber);
  378.     if (wp_config_read)
  379.         wp_get_prnname(tmp, 25);
  380.     else
  381.         strcpy(tmp, rsc_string(NODEVSTR));
  382.  
  383.     set_state(printer, DNLQ, DISABLED, !wp_config_read);
  384.     set_state(printer, DDICHTE, DISABLED, !wp_config_read);
  385.     set_state(printer, DDICHTESTR, DISABLED, !wp_config_read);
  386.  
  387.     set_state(printer, DNLQ, SELECTED, cfg->wp_nlq);
  388.     set_string(printer, DTREIBNAME, tmp);
  389.     set_int(printer, DPLENGTH, cfg->wp_s_len);
  390.     set_int(printer, DPWIDTH, cfg->wp_z_len);
  391.  
  392.     /* GDOS */
  393.     if (gl_gdos && get_gdos_device())
  394.     {
  395.         set_string(printer, DDEVICE, gdos_name);
  396.         set_state(printer, DDEVICE, DISABLED, FALSE);
  397.         set_state(printer, DFONTSEL, DISABLED, FALSE);
  398.  
  399.         set_int(printer, DPTS, cfg->font_pts);
  400.         get_fontname(cfg->font_id, tmp);
  401.         set_string(printer, DFONT, tmp);
  402.     }
  403.     else
  404.     {
  405.         set_string(printer, DDEVICE, rsc_string(NODEVSTR));
  406.         set_state(printer, DDEVICE, DISABLED, TRUE);
  407.         set_state(printer, DFONTSEL, DISABLED, TRUE);
  408.         set_string(printer, DFONT, "--");
  409.         set_string(printer, DPTS, "--");
  410.     }
  411.  
  412.     dial = open_mdial(printer, DPLENGTH);
  413.     if (dial != NULL)
  414.     {
  415.         while (!close)
  416.         {
  417.             antw = do_mdial(dial) & 0x7fff;
  418.             switch (antw)
  419.             {
  420.                 case DFONTSEL:
  421.                     if (sel_font(cfg))
  422.                     {
  423.                         set_int(printer, DPTS, cfg->font_pts);
  424.                         get_fontname(cfg->font_id, tmp);
  425.                         set_string(printer, DFONT, tmp);
  426.                     }
  427.                     break;
  428.         
  429.                 case DTREIBER :
  430.                     if (select_single(cfg->wp_treiber, "*.cfg", rsc_string(TREIBERSTR)))
  431.                     {
  432.                         wp_config_read = wp_load_cfgfile(cfg->wp_treiber);
  433.                         if (wp_config_read)
  434.                             wp_get_prnname(str, 25);
  435.                         else
  436.                             strcpy(str, rsc_string(NODEVSTR));
  437.                         set_string(printer, DTREIBNAME, str);
  438.                         set_state(printer, DNLQ, DISABLED, !wp_config_read);
  439.                         set_state(printer, DDICHTE, DISABLED, !wp_config_read);
  440.                     }
  441.                     set_state(printer, antw, SELECTED, FALSE);
  442.                     break;
  443.         
  444.                 case DDICHTESTR :
  445.                 case DDICHTE :
  446.                     if (antw == DDICHTE)
  447.                         i = handle_popup(printer, DDICHTE, popups, DICHTEPOP, POP_OPEN);
  448.                     else
  449.                         i = handle_popup(printer, DDICHTE, popups, DICHTEPOP, POP_CYCLE);
  450.                     if (i > 0)
  451.                         cfg->wp_mode = i - DICHTEPICA;
  452.                     break;
  453.         
  454.                 default:
  455.                     close = TRUE;
  456.                     break;
  457.             }
  458.             set_state(printer, antw, SELECTED, FALSE);
  459.             if (!close)
  460.                 redraw_mdobj(dial, antw);
  461.  
  462.         }
  463.         close_mdial(dial);
  464.         set_state(printer, antw, SELECTED, FALSE);
  465.         if (antw == DOK2)
  466.         {
  467.             cfg->wp_s_len = get_int(printer, DPLENGTH);
  468.             if (!cfg->wp_s_len)
  469.                 cfg->wp_s_len = 65;
  470.     
  471.             cfg->wp_z_len = get_int(printer, DPWIDTH);
  472.             if (!cfg->wp_z_len)
  473.                 cfg->wp_z_len = 80;
  474.     
  475.             cfg->wp_nlq = get_state(printer, DNLQ, SELECTED);
  476.             return TRUE;
  477.         }
  478.     }
  479.     return FALSE;
  480. }
  481.  
  482. static bool qed_start_dial(PRN_CFG *cfg)
  483. {
  484.     int    antw;
  485.     bool    start = FALSE;
  486.     
  487.     if (!wp_config_read && prn->wp_treiber[0] != EOS)
  488.         wp_config_read = wp_load_cfgfile(prn->wp_treiber);
  489.  
  490.     if (gl_gdos && (gdos_device == 0))
  491.         get_gdos_device();
  492.  
  493.     /* Allgemeine Parameter */
  494.     set_state(print, DZNUM, SELECTED, prn->num_zeilen);
  495.     set_state(print, DSNUM, SELECTED, prn->num_seiten);
  496.     set_state(print, DFEED, SELECTED, prn->vorschub);
  497.     set_state(print, DCHECK, SELECTED, prn->pruef_prn);
  498.     set_state(print, DALL, SELECTED, !prn->block);
  499.     set_state(print, DBLOCK, DISABLED, !prn->block);
  500.     set_state(print, DBLOCK, SELECTED, prn->block);
  501.     set_int(print, DRANDLEN, prn->rand_len);
  502.  
  503.     set_state(print, DGEMDOS, SELECTED, !prn->use_gdos);
  504.     set_state(print, DGDOS, SELECTED, prn->use_gdos);
  505.  
  506.     set_state(print, DGDOS, DISABLED, (gdos_device == 0));
  507.     set_state(print, DGDOS, SELECTED, ((gdos_device != 0) && (prn->use_gdos || !wp_config_read)));
  508.  
  509.     set_state(print, DGEMDOS, DISABLED, !wp_config_read);
  510.     set_state(print, DGEMDOS, SELECTED, (wp_config_read && !prn->use_gdos));
  511.  
  512.     set_state(print, DPRINT, DISABLED, (!wp_config_read && (gdos_device == 0)));
  513.     
  514.     antw = simple_mdial(print, DRANDLEN) & 0x7fff;
  515.     if ((antw == DOK1) || (antw == DPRINT))
  516.     {
  517.         prn->block = get_state(print, DBLOCK, SELECTED);
  518.         prn->use_gdos = get_state(print, DGDOS, SELECTED);
  519.         prn->num_zeilen = get_state(print, DZNUM, SELECTED);
  520.         prn->num_seiten = get_state(print, DSNUM, SELECTED);
  521.         prn->vorschub = get_state(print, DFEED, SELECTED);
  522.         prn->pruef_prn = get_state(print, DCHECK, SELECTED);
  523.         prn->rand_len = get_int(print, DRANDLEN);
  524.  
  525.         start = (antw == DPRINT);
  526.     }
  527.     return start;
  528. }
  529.  
  530. /* --------------------------------------------------------------------------- */
  531. /*
  532.  * Schnittstelle nach draußen
  533. */
  534. void prn_cfg_dial(void)
  535. {
  536.     bool        ok;
  537.     PRN_CFG    *new;
  538.     
  539.     prn->ausdruck = FALSE;                    /* Art des Dialogs: Konfig */
  540.     new = malloc(sizeof(PRN_CFG));
  541.     memcpy(new, prn, sizeof(PRN_CFG));
  542.     
  543.     if (prn->use_pdlg)
  544.         ok = pdlg_dial(new);
  545.     else
  546.         ok = qed_cfg_dial(new);
  547.     if (ok)
  548.     {
  549.         memcpy(prn, new, sizeof(PRN_CFG));
  550.     }
  551.     free(new);
  552. }
  553.  
  554. bool prn_start_dial(bool *block)
  555. {
  556.     bool    ok = FALSE;
  557.  
  558.     prn->ausdruck = TRUE;                    /* Art des Dialogs: Ausdruck */
  559.     if (block)
  560.         prn->block = *block;
  561.     else
  562.         prn->block = FALSE;
  563.  
  564.     if (prn->use_pdlg)
  565.     {
  566.         PRN_CFG    *new;
  567.         
  568.         prn->use_gdos = TRUE;
  569.         new = malloc(sizeof(PRN_CFG));
  570.         memcpy(new, prn, sizeof(PRN_CFG));
  571.         ok = pdlg_dial(new);
  572.         if (ok)
  573.             memcpy(prn, new, sizeof(PRN_CFG));
  574.         free(new);
  575.     }
  576.     else
  577.         ok = qed_start_dial(prn);
  578.  
  579.     if (block && ok)
  580.         *block = prn->block;
  581.  
  582.     return ok;
  583. }
  584.  
  585.  
  586. void prn_save_cfg(char *buffer)
  587. {
  588.     /* pdlg-Settings */
  589.     if (prn->pdlg != NULL)
  590.     {
  591.         char    *pdlg_file, *p;
  592.         FILE    *fd;
  593.                 
  594.         pdlg_file = strdup(buffer);
  595.         p = strrchr(pdlg_file, '\\');
  596.         if (p)
  597.             strcpy(p+1, CFGNAME);
  598.         else
  599.             strcpy(pdlg_file, CFGNAME);
  600.         fd = fopen(pdlg_file, "wb");
  601.         if (fd)
  602.         {
  603.             fwrite(prn->pdlg, 1, sizeof(PRN_SETTINGS), fd);
  604.             fclose(fd);
  605.         }
  606.         free(pdlg_file);
  607.     }    
  608.     /* sonstige Einstellungen */
  609.     write_cfg_bool("PrnCheck", prn->pruef_prn);
  610.     write_cfg_int("PrnDensity", prn->wp_mode);
  611.     write_cfg_str("PrnDriver", prn->wp_treiber);
  612.     write_cfg_int("PrnFontId", prn->font_id);
  613.     write_cfg_int("PrnFontSize", prn->font_pts);
  614.     write_cfg_bool("PrnFormfeed", prn->vorschub);
  615.     write_cfg_bool("PrnGdos", prn->use_gdos);
  616.     write_cfg_bool("PrnLineNumers", prn->num_zeilen);
  617.     write_cfg_int("PrnMarginLen", prn->rand_len);
  618.     write_cfg_bool("PrnNlq", prn->wp_nlq);
  619.     write_cfg_int("PrnPageHeight", prn->wp_s_len);
  620.     write_cfg_bool("PrnPageNumbers", prn->num_seiten);    
  621.     write_cfg_int("PrnPageWidth", prn->wp_z_len);
  622.     write_cfg_bool("PrnPdlg", prn->use_pdlg);
  623. }
  624.  
  625. bool prn_get_cfg(char *var, char *buffer)
  626. {
  627.     bool    ret = TRUE;
  628.  
  629.     if (var[0] != 'P')
  630.         ret = FALSE;
  631.  
  632.     else if (strcmp(var, "PrnCheck") == 0)
  633.         read_cfg_bool(buffer, &prn->pruef_prn);
  634.     else if(strcmp(var, "PrnDensity") == 0)
  635.         prn->wp_mode = atoi(buffer);
  636.     else if(strcmp(var, "PrnDriver") == 0)
  637.         read_cfg_str(buffer, prn->wp_treiber);
  638.     else if(strcmp(var, "PrnFontId") == 0)
  639.         prn->font_id = atoi(buffer);
  640.     else if(strcmp(var, "PrnFontSize") == 0)
  641.         prn->font_pts = atoi(buffer);
  642.     else if (strcmp(var, "PrnFormfeed") == 0)
  643.         read_cfg_bool(buffer, &prn->vorschub);
  644.     else if(strcmp(var, "PrnGdos") == 0)
  645.         read_cfg_bool(buffer, &prn->use_gdos);
  646.     else if (strcmp(var, "PrnLineNumers") == 0)
  647.         read_cfg_bool(buffer, &prn->num_zeilen);
  648.     else if (strcmp(var, "PrnMarginLen") == 0)
  649.         prn->rand_len = atoi(buffer);
  650.     else if(strcmp(var, "PrnNlq") == 0)
  651.         read_cfg_bool(buffer, &prn->wp_nlq);
  652.     else if(strcmp(var, "PrnPageHeight") == 0)
  653.         prn->wp_s_len = atoi(buffer);
  654.     else if (strcmp(var, "PrnPageNumbers") == 0)
  655.         read_cfg_bool(buffer, &prn->num_seiten);
  656.     else if(strcmp(var, "PrnPageWidth") == 0)
  657.         prn->wp_z_len = atoi(buffer);
  658.     else if(strcmp(var, "PrnPdlg") == 0)
  659.         read_cfg_bool(buffer, &prn->use_pdlg);
  660.  
  661.     /* Spezial-Fall: 'pdlg.qed' laden: in <buffer> ist der Pfad 'drin */
  662.     else if(strcmp(var, "PdlgRead") == 0)
  663.     {
  664.         char    *pdlg_file, *p;
  665.         FILE    *fd;
  666.                 
  667.         pdlg_file = strdup(buffer);
  668.         p = strrchr(pdlg_file, '\\');
  669.         strcpy(p+1, CFGNAME);
  670.         fd = fopen(pdlg_file, "rb");
  671.         if (fd)
  672.         {
  673.             fread(prn->pdlg, 1, sizeof(PRN_SETTINGS), fd);
  674.             fclose(fd);
  675.         }
  676.  
  677.         /* wenn kein WDIALOG da ist, auch nicht benutzen! */
  678.         if (!prn->pdlg_avail && prn->use_pdlg)
  679.             prn->use_pdlg = FALSE;
  680.  
  681.         free(pdlg_file);
  682.     }
  683.  
  684.     else
  685.         ret = FALSE;
  686.  
  687.     return ret;
  688. }
  689.  
  690.  
  691. void init_printer(void)
  692. {
  693.     prn = malloc(sizeof(PRN_CFG));
  694.     if (prn)
  695.     {
  696.         int    d, i;
  697.  
  698.         memset(prn, 0, sizeof(PRN_CFG));
  699.         prn->wp_s_len = 65;
  700.         prn->wp_z_len = 80;
  701.         prn->font_id = 1;
  702.         prn->font_pts = 10;    
  703.  
  704.         /* Ist WDialog installiert? */    
  705.         prn->pdlg_avail = (appl_xgetinfo(7, &i, &d, &d, &d) && ((i & 0x17) == 0x17));
  706.         if (prn->pdlg_avail)
  707.         {
  708.             PRN_DIALOG    *pd;
  709.     
  710.             /* Settings anlegen und default'en */
  711.             pd = pdlg_create(0);
  712.             if (pd)
  713.             {
  714.                 prn->pdlg = pdlg_new_settings(pd);
  715.                 pdlg_delete(pd);
  716.             }
  717.             else
  718.                 prn->pdlg_avail = FALSE;
  719.         }
  720.  
  721.         if (!prn->pdlg_avail)
  722.         {
  723.             /* damit die CFG erhalten bleibt! */
  724.             prn->pdlg = malloc(sizeof(PRN_SETTINGS));
  725.             memset(prn->pdlg, 0, sizeof(PRN_SETTINGS));
  726.         }
  727.     }
  728. }
  729.  
  730. void term_printer(void)
  731. {
  732.     if (prn)
  733.     {
  734.         if (prn->pdlg_avail)
  735.             pdlg_free_settings(prn->pdlg);
  736.         else
  737.             free(prn->pdlg);
  738.         free(prn);
  739.         prn = NULL;
  740.     }
  741. }
  742.